From c6e625750b31aca467e7921f604dd8dd9acd6776 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Tue, 23 Aug 2005 08:45:13 +0000 Subject: [PATCH] Add locking for gnttab_free_callback_list. Signed-off-by: Christian Limpach --- linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c index 7a9339d7b8..aff4da6a5e 100644 --- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c +++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c @@ -51,6 +51,7 @@ static grant_ref_t gnttab_free_head; static grant_entry_t *shared; static struct gnttab_free_callback *gnttab_free_callback_list = NULL; +static spinlock_t gnttab_free_callback_list_lock = SPIN_LOCK_UNLOCKED; /* * Lock-free grant-entry allocator @@ -69,8 +70,11 @@ get_free_entry( static void do_free_callbacks(void) { - struct gnttab_free_callback *callback = gnttab_free_callback_list, *next; + struct gnttab_free_callback *callback, *next; + spin_lock_irq(&gnttab_free_callback_list_lock); + callback = gnttab_free_callback_list; gnttab_free_callback_list = NULL; + spin_unlock_irq(&gnttab_free_callback_list_lock); while (callback) { next = callback->next; callback->next = NULL; @@ -86,8 +90,10 @@ put_free_entry( grant_ref_t fh, nfh = gnttab_free_head; do { gnttab_free_list[ref] = fh = nfh; wmb(); } while ( unlikely((nfh = cmpxchg(&gnttab_free_head, fh, ref)) != fh) ); + spin_lock_irq(&gnttab_free_callback_list_lock); if ( unlikely(gnttab_free_callback_list) ) do_free_callbacks(); + spin_unlock_irq(&gnttab_free_callback_list_lock); } /* @@ -274,8 +280,10 @@ gnttab_request_free_callback(struct gnttab_free_callback *callback, return; callback->fn = fn; callback->arg = arg; + spin_lock_irq(&gnttab_free_callback_list_lock); callback->next = gnttab_free_callback_list; gnttab_free_callback_list = callback; + spin_unlock_irq(&gnttab_free_callback_list_lock); } /* -- 2.30.2